﻿using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioTransferencia : IRepositorioTransferencia
    {
        public Transferencia Inserir(Transferencia transferencia)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(transferencia);
            return transferencia;
        }

        public Transferencia Atualizar(Transferencia transferencia)
        {
            Transferencia tmpTransferencia = ObterPorId(transferencia.TransferenciaId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpTransferencia.ContaBancoDestino = transferencia.ContaBancoDestino;
            tmpTransferencia.ContaBancoOrigem = transferencia.ContaBancoOrigem;
            tmpTransferencia.DataOperacao = transferencia.DataOperacao;
            tmpTransferencia.Documento = transferencia.Documento;
            tmpTransferencia.Historico = transferencia.Historico;
            tmpTransferencia.Valor = transferencia.Valor;
            tmpTransferencia.Usuario = transferencia.Usuario;

            GerenciadorBDConfigs.Instance.SessaoAtual().Update(tmpTransferencia);
            return tmpTransferencia;
        }

        public void Excluir(Transferencia transferencia)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(transferencia);
        }

        public IList<Transferencia> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Transferencia));
            return criteria.List<Transferencia>() as List<Transferencia>;
        }

        public Transferencia ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Transferencia>(id);
        }

        public IList<Transferencia> ObterTodos(int inicio, int quantidade, int quantidadeMinima, string numero, string documento, DateTime? inicioVigenciaDe, 
            DateTime? inicioVigenciaAte, ContaBanco contaBancoOrigem, ContaBanco contaBancoDestino, decimal? valorInicio, decimal? valorFim)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (Transferencia))
                .SetFirstResult(inicio).SetMaxResults(quantidade);

            if (!String.IsNullOrEmpty(numero))
            {
                criteria.Add(Restrictions.Eq("TransferenciaId", numero));
            }

            if (!String.IsNullOrEmpty(documento))
            {
                criteria.Add(Restrictions.Eq("Documento", documento));
            }

            if (inicioVigenciaDe.HasValue)
            {
                criteria.Add(inicioVigenciaAte.HasValue
                                ? Restrictions.Between("DataOperacao", inicioVigenciaDe.Value.Date, inicioVigenciaAte.Value.Date)
                                : Restrictions.Eq("DataOperacao", inicioVigenciaDe.Value.Date));
            }

            if(contaBancoOrigem != null)
            {
                criteria.Add(Restrictions.Eq("ContaBancoOrigem", contaBancoOrigem));
            }

            if (contaBancoDestino != null)
            {
                criteria.Add(Restrictions.Eq("ContaBancoDestino", contaBancoDestino));
            }

            if (valorInicio.HasValue && valorFim.HasValue)
            {
                criteria.Add(Restrictions.Between("Valor", valorInicio.Value, valorFim.Value));
            }

            return criteria.List<Transferencia>() as List<Transferencia>;
        }
    }
}